/*

Miranda IM: the free IM client for Microsoft* Windows*

Copyright 2000-2007 Miranda ICQ/IM project, 
all portions of this codebase are copyrighted to the people 
listed in contributors.txt.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
aLONG with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/

#ifndef _UI_CTRL_INCLUDE_
#define _UI_CTRL_INCLUDE_

#include <Richedit.h>
#include <shellapi.h>

#include "icons.h"

/* Ctrl		v0.1.0.3+
structures handling all controls
*/

// control types
#define CTRL_ERROR			0
#define CTRL_EDIT			1
#define CTRL_COMBOBOX_STAT	2
#define CTRL_DATEPICKER		3
#define CTRL_LIST_PROFILE	4
#define CTRL_LIST_ITEM		7

// control flags
#define CTRLF_CHANGED	1
#define CTRLF_HASPROTO	2
#define CTRLF_HASCUSTOM	4
#define CTRLF_HASMETA	8

#define CTRLF_FIRST		16 // first free flag for derived controls

typedef struct TCtrlInfo {
	BYTE	nType;
	WORD	wFlags;
} CTRL, *LPCTRL;

extern COLORREF clrBoth;
extern COLORREF clrChanged;
extern COLORREF clrCustom;
extern COLORREF clrNormal;
extern COLORREF clrMeta;

VOID Ctrl_InitTextColours(VOID);
INT CALLBACK Ctrl_SetTextColour(HDC hdc, WORD wFlags);
INT CALLBACK Ctrl_SetTextColour(HWND hCtrl, HDC hdc);


/**
 *	ctrlCombo.cpp
 **/

/* ComboBox		v0.1.0.3+
everything to handle comboboxes
*/
#define CBF_INITIALIZED	(CTRLF_FIRST)

typedef struct TCBCtrl : CTRL {
	INT				nTopItem;			// index of top most writeable item
	LPIDSTRLIST		pItems;				// pointer to static stringlist
	UINT			nItems;				// number of static items
} CBCTRL, *LPCBCTRL;

// common combobox functions
VOID	 ComboBox_Destroy(HWND hDlg, INT idComboBox);
INT		 ComboBox_AddItem(HWND hComboBox, LPCSTR pszText, LPARAM lParam);
INT		 ComboBox_InsertItem(HWND hComboBox, INT nIndex, LPCSTR pszText, LPARAM lParam);
LPARAM	 ComboBox_RemoveItem(HWND hComboBox, INT nIndex);
VOID	 ComboBox_SelChanged(HWND hDlg, HWND hComboBox);
VOID	 ComboBox_CountrySelChanged(HWND hDlg, HWND hComboBox, HWND hIconCtrl);

LPVOID   ComboBox_GetItem(HWND hComboBox, INT nIndex, LPSTR *szText, LPINT ccText, LPARAM *lParam);

// combobox functions for those whose content is static such as country lists, ...
BOOLEAN	 ComboBox_AddItems(HWND hComboBox, LPIDSTRLIST pList, UINT numItems, INT nUnspecifiedID, INT nSelectedID, LPCSTR pszSelected);
BYTE	 ComboBox_WriteItem(HWND hDlg, INT idCombo, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting, BYTE bType, BOOLEAN isSigned = FALSE);
BYTE	 ComboBox_SelectItem(HWND hDlg, INT idCombo, LPIDSTRLIST pItems, UINT numItems, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting, INT errorValue, BOOLEAN isSigned = FALSE);
VOID	 ComboBox_DropDown(HWND hComboBox);

/**
 *	ctrlEdit.cpp
 **/

/* EditBox		v0.1.0.3+
everything to handle editboxes
*/
typedef struct TEditCtrl : CTRL {
	BYTE	valueType;
} ECTRL, *LPECTRL;

LPECTRL	Edit_Init(HANDLE hContact, HWND hEdit);
BYTE	Edit_SetValue(HWND hDlg, INT idEdit, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting);
BYTE	Edit_WriteValue(HWND hDlg, INT idEdit, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting, BYTE bType = DBVT_WCHAR);
INT		Edit_Changed(HWND hDlg, INT idEdit, LPCSTR szModule, LPCSTR szSetting);
VOID	Edit_Destroy(HWND hDlg, INT idEdit);
VOID	Edit_OpenUrl(HWND hDlg, INT idEdit);
LRESULT Edit_LinkNotificationHandler(HWND hDlg, ENLINK* lnk);

// richedit uses different methods to read and write text
#ifdef _UNICODE
# define CP_TCHAR					1200
#else
# define CP_TCHAR					CP_ACP
#endif

DWORD	RichEdit_GetTextLength(HWND hRichEdit);
BYTE	RichEdit_SetValue(HWND hDlg, INT idEdit, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting);
VOID	RichEdit_WriteValue(HWND hDlg, INT idEdit, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting);
INT		RichEdit_Changed(HWND hDlg, INT idEdit, LPCSTR szModule, LPCSTR szSetting);

/**
 *	ctrlContact.cpp
 **/

/* contact control	v0.1.0.6+
*/
#define UINFOCOMBOEXCLASS	_T("UInfoComboExWndClass")

// messages
#define CBEXM_ADDITEM		(WM_USER+4)
#define CBEXM_GETITEM		(WM_USER+5)
#define CBEXM_SETITEM		(WM_USER+6)
#define CBEXM_DELITEM		(WM_USER+7)
#define CBEXM_DELALLITEMS	(WM_USER+8)
#define CBEXM_ISCHANGED		(WM_USER+9)
#define CBEXM_RESETCHANGED	(WM_USER+10)
#define CBEXM_SETCURSEL		(WM_USER+11)
#define CBEXM_SORT			(WM_USER+12)
#define CBEXM_ENABLEITEM	(WM_USER+13)

// item masks
#define CBEXIM_FLAGS		0x0001
#define CBEXIM_CAT			0x0002
#define CBEXIM_VAL			0x0004
#define CBEXIM_ICONTEXT		0x0008
#define CBEXIM_ID			0x0010
#define CBEXIM_ALL			(CBEXIM_ID|CBEXIM_ICONTEXT|CBEXIM_CAT|CBEXIM_VAL|CBEXIM_FLAGS)

#define CBEXIF_CATREADONLY	(CTRLF_FIRST)
#define CBEXIF_SMS			(CTRLF_FIRST * 2)
#define CBEXIF_DELETED		(CTRLF_FIRST * 4)

typedef struct TComboExItem
{
	WORD	wMask;			// determines which element of this structure is valid
	WORD	wFlags;			// standard control flags
	INT		iItem;			// position of the item in the data array
	DWORD	dwID;			// unique number for each setting read from db to identify it, new entries have dwID = 0
	LPTSTR	pszCat;			// pointer to a descriptive category string to set or retrieve for the data entry
	WORD	ccCat;
	LPTSTR	pszVal;
	WORD	ccVal;
	LPCSTR	pszIcon;
} CBEXITEM, *LPCBEXITEM;

INT	CbEx_LoadModule();
INT CbEx_UnLoadModule();
INT CbEx_AddItemFromDB(HWND hCtrl, LPCSTR szIcon, LPTSTR szItem, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSettingVal);
INT CbEx_AddMyItemsFromDB(HWND hCtrl, LPCSTR szIcon, WORD wForcedFlags, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szFormatCat, LPCSTR szFormatVal);
INT CbEx_WriteItemToDB(HWND hCtrl, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting);
INT CbEx_WriteMyItemsToDB(HWND hCtrl, INT iFirstItem, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szFormatCat, LPCSTR szFormatVal);






#endif /* _UI_CTRL_INCLUDE_ */